New function to obtain a list of toplevel widgets constructed by the ui
authorMatthias Clasen <maclas@gmx.de>
Thu, 8 Jan 2004 23:37:34 +0000 (23:37 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 8 Jan 2004 23:37:34 +0000 (23:37 +0000)
Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>

* gtk/gtkuimanager.h:
* gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
obtain a list of toplevel widgets constructed by the ui manager.

* gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that
the values can be combined for gtk_ui_manager_get_toplevels().

* tests/testmerge.c: Add a "Dump toplevels" button to test
gtk_ui_manager_get_toplevels().

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gtk/gtkuimanager.c
gtk/gtkuimanager.h
tests/testmerge.c

index 6ecc812a238f336ff85d1464aa7bf973ed285af4..fbec286c0a1f28c3543441309422799c157bf5a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.h:
+       * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
+       obtain a list of toplevel widgets constructed by the ui manager.
+
+       * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that 
+       the values can be combined for gtk_ui_manager_get_toplevels().
+
+       * tests/testmerge.c: Add a "Dump toplevels" button to test 
+       gtk_ui_manager_get_toplevels().
+
 Wed Jan  7 23:20:06 2004  Matthias Clasen  <maclas@gmx.de>
 
        * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c
index 6ecc812a238f336ff85d1464aa7bf973ed285af4..fbec286c0a1f28c3543441309422799c157bf5a9 100644 (file)
@@ -1,3 +1,15 @@
+Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.h:
+       * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
+       obtain a list of toplevel widgets constructed by the ui manager.
+
+       * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that 
+       the values can be combined for gtk_ui_manager_get_toplevels().
+
+       * tests/testmerge.c: Add a "Dump toplevels" button to test 
+       gtk_ui_manager_get_toplevels().
+
 Wed Jan  7 23:20:06 2004  Matthias Clasen  <maclas@gmx.de>
 
        * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c
index 6ecc812a238f336ff85d1464aa7bf973ed285af4..fbec286c0a1f28c3543441309422799c157bf5a9 100644 (file)
@@ -1,3 +1,15 @@
+Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.h:
+       * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
+       obtain a list of toplevel widgets constructed by the ui manager.
+
+       * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that 
+       the values can be combined for gtk_ui_manager_get_toplevels().
+
+       * tests/testmerge.c: Add a "Dump toplevels" button to test 
+       gtk_ui_manager_get_toplevels().
+
 Wed Jan  7 23:20:06 2004  Matthias Clasen  <maclas@gmx.de>
 
        * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c
index 6ecc812a238f336ff85d1464aa7bf973ed285af4..fbec286c0a1f28c3543441309422799c157bf5a9 100644 (file)
@@ -1,3 +1,15 @@
+Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.h:
+       * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
+       obtain a list of toplevel widgets constructed by the ui manager.
+
+       * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that 
+       the values can be combined for gtk_ui_manager_get_toplevels().
+
+       * tests/testmerge.c: Add a "Dump toplevels" button to test 
+       gtk_ui_manager_get_toplevels().
+
 Wed Jan  7 23:20:06 2004  Matthias Clasen  <maclas@gmx.de>
 
        * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c
index 6ecc812a238f336ff85d1464aa7bf973ed285af4..fbec286c0a1f28c3543441309422799c157bf5a9 100644 (file)
@@ -1,3 +1,15 @@
+Fri Jan  9 00:34:57 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.h:
+       * gtk/gtkuimanager.c (gtk_ui_manager_get_toplevels): New function to
+       obtain a list of toplevel widgets constructed by the ui manager.
+
+       * gtk/gtkuimanager.h (GtkUIManagerItemType): Change to flags, so that 
+       the values can be combined for gtk_ui_manager_get_toplevels().
+
+       * tests/testmerge.c: Add a "Dump toplevels" button to test 
+       gtk_ui_manager_get_toplevels().
+
 Wed Jan  7 23:20:06 2004  Matthias Clasen  <maclas@gmx.de>
 
        * demos/gtk-demo/Makefile.am (demos): Add entry_completion.c
index 0337bb7d5f82e82d4ab0b8ebdbd865d78a88394e..5ff93a2689d70d5e3a6407b5a62f26213d7c653b 100644 (file)
@@ -1,3 +1,7 @@
+Fri Jan  9 00:38:58 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtk-sections.txt: Add gtk_ui_manager_get_toplevels.
+
 Thu Jan  8 00:14:02 2004  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/tmpl/gtkmain.sgml (gtk_input_add_full): Fix link in deprecation
index a5531ebf2b2de168372acb31f69945e779be6aed..9747ab463cebc20e8f38fd60dd57653df0b7d366 100644 (file)
@@ -1951,6 +1951,7 @@ gtk_ui_manager_remove_action_group
 gtk_ui_manager_get_action_groups
 gtk_ui_manager_get_accel_group
 gtk_ui_manager_get_widget
+gtk_ui_manager_get_toplevels
 gtk_ui_manager_get_action
 gtk_ui_manager_add_ui_from_string
 gtk_ui_manager_add_ui_from_file
index 11780713431e9a0a55b12f9b7dce4be11075cc00..953756e0970772328de2cd0f6929e9584deb022f 100644 (file)
@@ -558,6 +558,70 @@ gtk_ui_manager_get_widget (GtkUIManager *self,
   return NODE_INFO (node)->proxy;
 }
 
+static void
+collect_toplevels (GNode   *node, 
+                  gpointer user_data)
+{
+  struct {
+    GtkUIManagerItemType types;
+    GSList *list;
+  } *data = user_data;
+
+  switch (NODE_INFO (node)->type) {
+  case NODE_TYPE_MENUBAR:
+    if (data->types & GTK_UI_MANAGER_MENUBAR)
+      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+    break;
+  case NODE_TYPE_TOOLBAR:
+    if (data->types & GTK_UI_MANAGER_TOOLBAR)
+      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+    break;
+  case NODE_TYPE_POPUP:
+    if (data->types & GTK_UI_MANAGER_POPUP)
+      data->list = g_slist_prepend (data->list, NODE_INFO (node)->proxy);
+    break;
+  default: ;
+  }
+}
+
+/**
+ * gtk_ui_manager_get_toplevels:
+ * @self: a #GtkUIManager
+ * @types: specifies the types of toplevel widgets to include. Allowed
+ *   types are #GTK_UI_MANAGER_MENUBAR, #GTK_UI_MANAGER_TOOLBAR and
+ *   #GTK_UI_MANAGER_POPUP.
+ * 
+ * Obtains a list of all toplevel widgets of the requested types.
+ * 
+ * Return value: a list of all toplevel widgets of the requested types. 
+ *
+ * Since: 2.4
+ **/
+GSList *
+gtk_ui_manager_get_toplevels (GtkUIManager         *self,
+                             GtkUIManagerItemType  types)
+{
+  struct {
+    GtkUIManagerItemType types;
+    GSList *list;
+  } data;
+
+  g_return_val_if_fail ((~(GTK_UI_MANAGER_MENUBAR | 
+                          GTK_UI_MANAGER_TOOLBAR |
+                          GTK_UI_MANAGER_POPUP) & types) == 0, NULL);
+  
+      
+  data.types = types;
+  data.list = NULL;
+
+  g_node_children_foreach (self->private_data->root_node, 
+                          G_TRAVERSE_ALL, 
+                          collect_toplevels, &data);
+
+  return data.list;
+}
+
+
 /**
  * gtk_ui_manager_get_action:
  * @self: a #GtkUIManager
@@ -1697,12 +1761,13 @@ static void
 update_smart_separators (GtkWidget *proxy)
 {
   GtkWidget *parent = NULL;
-
+  
   if (GTK_IS_MENU (proxy) || GTK_IS_TOOLBAR (proxy))
     parent = proxy;
   else if (GTK_IS_MENU_ITEM (proxy) || GTK_IS_TOOL_ITEM (proxy))
     parent = gtk_widget_get_parent (proxy);
 
+  
   if (parent) 
     {
       gboolean visible;
index d6f2c6a6e3ee8a6e1ca6f8a92833e0c71ab371f7..edf043a2009edadd9c1394f799f5c25a4859ed2c 100644 (file)
@@ -75,16 +75,16 @@ struct _GtkUIManagerClass {
 };
 
 typedef enum {
-  GTK_UI_MANAGER_AUTO,
-  GTK_UI_MANAGER_MENUBAR,
-  GTK_UI_MANAGER_MENU,
-  GTK_UI_MANAGER_TOOLBAR,
-  GTK_UI_MANAGER_PLACEHOLDER,
-  GTK_UI_MANAGER_POPUP,
-  GTK_UI_MANAGER_MENUITEM,
-  GTK_UI_MANAGER_TOOLITEM,
-  GTK_UI_MANAGER_SEPARATOR,
-  GTK_UI_MANAGER_ACCELERATOR
+  GTK_UI_MANAGER_AUTO         = 0,
+  GTK_UI_MANAGER_MENUBAR      = 1 << 0,
+  GTK_UI_MANAGER_MENU         = 1 << 1,
+  GTK_UI_MANAGER_TOOLBAR      = 1 << 2,
+  GTK_UI_MANAGER_PLACEHOLDER  = 1 << 3,
+  GTK_UI_MANAGER_POPUP        = 1 << 4,
+  GTK_UI_MANAGER_MENUITEM     = 1 << 5,
+  GTK_UI_MANAGER_TOOLITEM     = 1 << 6,
+  GTK_UI_MANAGER_SEPARATOR    = 1 << 7,
+  GTK_UI_MANAGER_ACCELERATOR  = 1 << 8
 } GtkUIManagerItemType;
 
 GType          gtk_ui_manager_get_type            (void);
@@ -101,6 +101,8 @@ GList         *gtk_ui_manager_get_action_groups   (GtkUIManager          *self);
 GtkAccelGroup *gtk_ui_manager_get_accel_group     (GtkUIManager          *self);
 GtkWidget     *gtk_ui_manager_get_widget          (GtkUIManager          *self,
                                                   const gchar           *path);
+GSList        *gtk_ui_manager_get_toplevels       (GtkUIManager          *self,
+                                                  GtkUIManagerItemType   types);
 GtkAction     *gtk_ui_manager_get_action          (GtkUIManager          *self,
                                                   const gchar           *path);
 guint          gtk_ui_manager_add_ui_from_string  (GtkUIManager          *self,
index 09f190e89bdc118946b5ed0f1f63ff1b8f2d8809..75d94de5ad9e1fa6aaecfd42e4c50f35cb963061 100644 (file)
@@ -34,6 +34,27 @@ dump_accels (void)
   gtk_accel_map_save_fd (STDOUT_FILENO);
 }
 
+static void
+print_toplevel (GtkWidget *widget, gpointer user_data)
+{
+  g_print ("%s\n", G_OBJECT_TYPE_NAME (widget));
+}
+
+static void
+dump_toplevels (GtkWidget    *button, 
+               GtkUIManager *merge)
+{
+  GSList *toplevels;
+
+  toplevels = gtk_ui_manager_get_toplevels (merge, 
+                                           GTK_UI_MANAGER_MENUBAR |
+                                           GTK_UI_MANAGER_TOOLBAR |
+                                           GTK_UI_MANAGER_POPUP);
+
+  g_slist_foreach (toplevels, print_toplevel, NULL);
+  g_slist_free (toplevels);
+}
+
 static void
 toggle_tearoffs (GtkWidget    *button, 
                 GtkUIManager *merge)
@@ -652,6 +673,10 @@ main (int argc, char **argv)
   g_signal_connect (button, "clicked", G_CALLBACK (dump_tree), merge);
   gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
 
+  button = gtk_button_new_with_label ("Dump Toplevels");
+  g_signal_connect (button, "clicked", G_CALLBACK (dump_toplevels), merge);
+  gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
   button = gtk_button_new_with_label ("Dump Accels");
   g_signal_connect (button, "clicked", G_CALLBACK (dump_accels), NULL);
   gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);